package br.edu.unifei.cct720.trabalho06.model.preenchimento;

import java.util.ArrayList;
import java.util.List;

import br.edu.unifei.cct720.trabalho06.model.formas.Borda;

/**
 * Classe que representa as retas do
 * preenchimento dos poligonos
 * 
 * @author fknappe
 *
 */
public class Scanline {

	// Declaracao das variaveis de instancia
	private List<Borda> bordas;

	/**
	 * Construtor
	 */
	public Scanline() {
		this.bordas = new ArrayList<Borda>();
	}

	/**
	 * Metodo responsavel por adicionar uma
	 * borda a lista
	 * 
	 * @param Borda borda
	 */
	public void addBorda(Borda borda) {
		bordas.add(borda);
	}

	/**
	 * Metodo responsavel por remover uma borda
	 * da lista 
	 * 
	 * @param Borda borda
	 */
	public void removeBorda(Borda borda) {
		bordas.remove(borda);
	}	

	/**
	 * Metodo responsavel por realizar a ordenacao
	 * das bordas contidas no scanline
	 * 
	 * @return void
	 */
	public void sort() {
		
		// Declaracao de variaveis locais
		Borda borda = null;
		
		/*
		 *  Verificando a necessidade de ordenacao das bordas,
		 *  de acordo com o valor da coordenada X das bordas
		 */
		for (int i = 0; i < bordas.size() - 1; i++) {
			for (int j = 0; j < bordas.size() - 1 - i; j++) {
				if (bordas.get(j).getX() > bordas.get(j + 1).getX()) {
					borda = bordas.get(j).clone();
					bordas.get(j).setX(bordas.get(j + 1).getX());
					bordas.get(j).setY(bordas.get(j + 1).getY());
					bordas.get(j).setMInverso(bordas.get(j + 1).getMInverso());

					bordas.get(j + 1).setX(borda.getX());
					bordas.get(j + 1).setY(borda.getY());
					bordas.get(j + 1).setMInverso(borda.getMInverso());
				}
			}
		}
	}
	
	// Metodos getters e setters
	public List<Borda> getBordas() {
		return this.bordas;
	}

	public void setBordas(ArrayList<Borda> bordas) {
		this.bordas = bordas;
	}
}
